package cn.xudy.group.Dao.daoImpl;

import cn.xudy.group.Dao.StorageDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


/**
 * Created by Ulegal on 2017/11/1.
 */
@Repository
public class StorageDaoImpl implements StorageDao{

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Override
    public List<Map<String, Object>> getInfo() {


        // 传统方法
        List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
        String  sql  =   "SELECT * FROM " + "Table_1" +";";
        list = jdbcTemplate.queryForList(sql);
        System.out.println("-------------"+list);

        return list;
    }

    /**
     * 整体的意思是“创建一个类型变量cur，它引用游标”，除了cur外，其余全是关键字。
     TYPE cur：定义类型变量
     is ref cursor：相当于数据类型，不过是引用游标的数据类型。
     这种变量通常用于存储过程和函数返回结果集时使用，因为PL/SQL不允许存储过程或函数直接返回结果集，但可以返回类型变量，于是引用游标的类型变量作为输出参数或返回值就应运而生了
     * @return
     */

    public String StorageInfo(){
        String param2Value = (String) jdbcTemplate.execute(
                new CallableStatementCreator() {
                    public CallableStatement createCallableStatement(Connection con) throws SQLException {
                        String storedProc = "{CALL  getAllBooks(?)}";// 调用的sql
                        CallableStatement cs = con.prepareCall(storedProc);
                        cs.setInt(1, 2);// 设置输入参数的值
//                        cs.setString(2, "99");// 设置输入参数的值
//                        cs.registerOutParameter(2, Types.VARCHAR);// 注册输出参数的类型
                        return cs;
                    }
                }, new CallableStatementCallback() {
                    public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
                        cs.execute();
                      //ResultSet rs = (ResultSet) cs.getObject(2);// 获取游标一行的值
                        ResultSet rs = cs.getResultSet();
//                        System.out.println("CallableStatementCallback-------------:"+cs.getString(1));
//                        while(rs.next()){
//                            int id = rs.getInt(1);
//                            String book_name = rs.getString(2);
//                            String book_auth = rs.getString(4);
//                            System.out.println("id:"+id+" 书名："+book_name+" 作者："+book_auth);
//                        }
                        return null;// 获取输出参数的值
                    }
                });
        System.out.println("天天-------------:"+param2Value);
        return param2Value;
    }















}






























































